var Questions = require('../models/Questions')

class QuestionsCtl {
    async find(ctx) {
        // 每页条数
        const perPage = parseInt(ctx.query.perPage) || 10
        // 当前页
        const page = parseInt(ctx.query.page) || 1
        // 跳过条数
        const start = (page - 1) * perPage
        const q = new RegExp(ctx.query.q)
        // 可匹配标题和提问详情
        const list = await Questions.find({$or: [{title: q}, {description: q}]}).limit(perPage).skip(start).sort({createdAt: -1})
        // 总条数
        const total = await Questions.find({$or: [{title: q}, {description: q}]}).countDocuments()
        // 向上取整 一共有多少页    
        const totalPage = Math.ceil(total / perPage)
        ctx.body = {
            perPage,
            page,
            list,
            total,
            totalPage
        }
    }

    async checkQuestionExist(ctx, next) {
        const question = await Questions.findById(ctx.params.id).select('+questioner')
        if (!question) {
            ctx.throw(404, '问题不存在')
        }
        // 问题存在，则存储提问者信息
        // {
        //     _id: 61c28fcbf933663df429cbb9,
        //     title: '辟邪剑法为什么非得挥刀自宫',
        //     questioner: 61bff83a50ef6c51ec1392ba, // 通过ref:'Users' 关联用户
        //     createdAt: 2021-12-22T02:39:07.854Z,
        //     updatedAt: 2021-12-22T02:39:07.854Z
        // }
        ctx.state.question = question
        await next()
    }

    async checkQuestioner(ctx, next) {
        const {question} = ctx.state
        // 创建问题的用户，必须和修改问题的用户是同一人
        if (question.questioner.toString() !== ctx.state.user._id) {
            ctx.throw(403, '没有权限')
        }
        await next()
    }

    async findById(ctx) {
        // 是否显示 fields
        // http://localhost:3000/topics/5e48e26bfb874d2f6ca2ace7?fields=description
        // ?fields后面写上指定的参数，即可返回指定的字段
        const {fields = '', populate = ''} = ctx.query
        const selectFields = fields.split(';').filter(f => f).map(f => ' +' + f).join('')
        // 'questioner topics'
        const populateStr = populate.split(';').filter(f => f).map(f => f).join(' ')
        console.log(selectFields);
        console.log(populateStr);
        // 提问者-问题 一对多关系
        // 问题-话题 多对多关系
        const question = await Questions.findById(ctx.params.id).select(selectFields).populate(populateStr)
        ctx.body = question
    }

    // 创建问题
    // questioner创建问题的人
    // topics问题的话题
    async create(ctx) {
        // 验证 问题名是必须的，所以required为true
        ctx.verifyParams({
            title: {type: 'string', required: true},
            description: {type: 'string', required: false},
            topics: {type: 'array', itemType: 'string', required: false},
        })
        // var {name}=ctx.request.body
        // var repeatedUser=await Questions.findOne({name})
        // if(repeatedUser)  ctx.throw(409,'此用户已被占用')
        const questioner = ctx.state.user._id
        var question = await new Questions({...ctx.request.body, questioner}).save()
        ctx.body = question
    }

    async update(ctx) {
        ctx.verifyParams({
            title: {type: 'string', required: false},
            description: {type: 'string', required: false},
            topics: {type: 'array', itemType: 'string', required: false},
        })
        var question = await Questions.findByIdAndUpdate(ctx.params.id, ctx.request.body, {
            new: true
        })
        ctx.body = question
        // {
        //     "title":"北美",
        //     "description": "置之死地而后生-",
        //     "topics":["5e58898d42a9f10340e2bdc4","5e58893a42a9f10340e2bdc0"]
        // }
        // 问题-话题 多对多关系,所以更新的时候需要传话题的id，即可关联
    }

    async remove(ctx) {
        var question = await Questions.findByIdAndRemove(ctx.params.id)
        ctx.body = question
    }
}

module.exports = new QuestionsCtl()
